/*
  Programa Wifis, 2010-2011
  Autor: Nilhcraiv

This file is part of Wifis.

    Wifis is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Wifis is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Wifis.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <QMessageBox>
#include <QFileInfo>
#include <QFileDialog>
#include <QProcess>

#include "updatesThread.h"

updatesThread::updatesThread(QWidget *parent,double *version,bool *inicio) :
    QWidget(parent)
{
    fileDownload = QDir::homePath().append("\\.Wifis__Update.exe");
    file = new QFile(fileDownload);
    qnam = new QNetworkAccessManager(this);

    hayError = false;
    isStart = inicio;
    versionInstalada = *version;
    url = "http://wifis.googlecode.com/svn/wiki/version";
}

updatesThread::~updatesThread()
{
    delete file;
    delete qnam;
}

void updatesThread::ejecutar()
{
    textoUpdates.clear();

    reply = qnam->get(QNetworkRequest(QUrl(url)));
    connect(this->reply, SIGNAL(readyRead()),this, SLOT(readyReadByteArray()));
    connect(this->reply, SIGNAL(finished()),this, SLOT(finished()));
    connect(this->reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(errorCheckUpdates(QNetworkReply::NetworkError)));
}

//Private slots

void updatesThread::readyRead()
{
    if (file)
        file->write(reply->readAll());
}//readyRead

void updatesThread::readyReadByteArray()
{
    textoUpdates.append(reply->readAll());
}//readyRead

void updatesThread::errorCheckUpdates(QNetworkReply::NetworkError code)
{
    hayError=true;

    emit closeProgressDialog();

    if(*isStart){//Si el error se produce al principio, es decir, cuando se inicia la aplicacion...
        *isStart = false; return;}

    emit setTextDialog("Ha ocurrido un error al comprobar las actualizaciones\n"
                       "Compruebe su conexion a internet");
    emit setTextCancelDialog("Salir");
    emit setTextCaptionDialog("Error");

    emit showDialog(true);
}//error

void updatesThread::error(QNetworkReply::NetworkError code)
{
    file->close();

    hayError=true;

    emit closeProgressDialog();

    if(*isStart)
        return;

    emit removeButtonDialogUpdate();

    emit setTextDialog("Ha ocurrido un error al descargar la actualizacion, intentelo de nuevo pasados unos minutos.\n"
                       "Compruebe su conexion a internet");
    emit setTextCancelDialog("Salir");
    emit setTextCaptionDialog("Error");

    emit showDialog(true);
}//error

void updatesThread::finished()
{
    if(hayError)
        return;

    bool ok;
    QString auxiliar;

    for(int i=0;i<4;i++)//siempre en el servidor se escribirá primero la versión y despues el link de descarga
        auxiliar.append(textoUpdates.at(i));

    versionServidor = auxiliar.toDouble(&ok);

    emit closeProgressDialog();
    emit removeButtonDialogUpdate();

    if(ok)
    {
        if(versionServidor>versionInstalada)
        {
            QString j("¡¡Hay una NUEVA VERSIÓN!!\nUsted tiene instalada la versión: "),x, y, mejoras;
            bool condicion=false; int i=0;

            while(condicion==false)
            {
                if(textoUpdates.at(i)=='M' && textoUpdates.at(i+1)=='E' && textoUpdates.at(i+2)=='J' && textoUpdates.at(i+3)=='O' &&
                        textoUpdates.at(i+4)=='R' && textoUpdates.at(i+5)=='A' && textoUpdates.at(i+6)=='S')
                {
                    condicion = true;
                }
                if(i>=textoUpdates.size())
                {
                    emit setTextDialog("Ha ocurrido un error");
                    emit setTextCaptionDialog("Error");

                    emit showDialog(true);
                }
                i++;
            }//while

            mejoras = textoUpdates.right(textoUpdates.size()-i+1);

            x.setNum(versionInstalada); y.setNum(versionServidor);
            emit setTextDialog(j + x + "\nEn el servidor se encuentra la versión: " + y + "\nPulse actualizar para instalarla.\n\n"
                               + mejoras);
            emit setTextCancelDialog("Cancelar");
            emit addButtonDialog("Actualizar",QDialogButtonBox::AcceptRole);
            emit setTextCaptionDialog("Actualizaciones");

            emit showDialog(true);
        }

        if(versionServidor==versionInstalada && !*isStart)
        {
            QString j("Wifis esta actualizado!\nUsted tiene instalada la versión: "),x, y, saludo;
            x.setNum(versionInstalada); y.setNum(versionServidor);
            bool condicion=false; int i=0;

            while(condicion==false)
            {
                if(textoUpdates.at(i)=='_' && textoUpdates.at(i+1)=='_' && textoUpdates.at(i+2)=='_')
                {
                    condicion = true;
                }
                if(i>=textoUpdates.size())
                {
                    emit setTextDialog("Ha ocurrido un error");
                    emit setTextCaptionDialog("Error");

                    emit showDialog(true);
                }
                i++;
            }//while

            saludo = textoUpdates.right(textoUpdates.size()-i+1);

            emit setTextDialog(j + x + "\nEn el servidor se encuentra la versión: " + y + "\n" + saludo);
            emit setTextCancelDialog("Salir");
            emit setTextCaptionDialog("Actualizaciones");

            emit showDialog(true);
        }

        if(versionServidor<versionInstalada && !*isStart)
        {
            QString j("Esta usando una versión INESTABLE de Wifis!\nUsted tiene instalada la versión: "),x, y;
            x.setNum(versionInstalada); y.setNum(versionServidor);
            emit setTextDialog(j + x + "\nEn el servidor se encuentra la versión: " + y);
            emit setTextCancelDialog("Salir");
            emit setTextCaptionDialog("Actualizaciones");

            emit showDialog(true);
        }

    }
    else
    {
        emit setTextDialog("Ha ocurrido un error");
        emit setTextCaptionDialog("Error");

        emit showDialog(true);
    }

    *isStart = false;
}//finished

void updatesThread::finishDownload()
{
    if(hayError)
        return;

    file->close();

    emit closeProgressDialog();

    QProcess ejecutar;
            QStringList arguments;
            arguments << "/C" << fileDownload;

            if(ejecutar.startDetached("cmd.exe", arguments))
            {
                exit(0);//this->close();//cierro la ventana actual, para evitar problemas en la inslatación
            }else
            {
                emit setTextDialog("Ha ocurrido un error al iniciar la instalación.");
                emit setTextCaptionDialog("Error");

                emit showDialog(true);

                QFile::remove(fileDownload);//En el caso de que salga mal, borro lo descargado
            }

    emit blockSignalsQTimer(false);
}//finishDaonwload

void updatesThread::updateDataReadProgress(qint64 bytesReceived, qint64 bTotal)
{
    emit bytesTotal(bTotal);

    if(bytesReceived<bTotal)
        emit bytesRead(bytesReceived);

}//updatesDataReadProgress

//Publics slots
void updatesThread::checkLinkdownloadNewVersion()
{
    emit showDialog(false);

    QString linkDownload;

    for(int i=5;textoUpdates.at(i)!='\n';i++)//Siempre el enlace de descarga debe de estar despues de la version
            linkDownload.append(textoUpdates.at(i));//ejemplo 0.01 http://enlace/descarga, debe quedar solo el enlace

    url = linkDownload;

    downloadNewVersion();

}//downloadNewVersion

//Private

void updatesThread::downloadNewVersion()
{   
    file->open(QIODevice::WriteOnly);

    QProgressDialog *dialog;
    dialog = new QProgressDialog("Descargando",0,0,0,this);
    dialog->setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::CustomizeWindowHint);
    connect(this,SIGNAL(closeProgressDialog()),dialog,SLOT(close()));
    connect(this,SIGNAL(bytesTotal(int)),dialog,SLOT(setMaximum(int)));
    connect(this,SIGNAL(bytesRead(int)),dialog,SLOT(setValue(int)));

    reply = qnam->get(QNetworkRequest(QUrl(url)));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(error(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(finished()),this, SLOT(finishDownload()));
    connect(reply, SIGNAL(readyRead()),this, SLOT(readyRead()));
    connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(updateDataReadProgress(qint64,qint64)));


    dialog->exec();

    delete dialog;
}//downloadNewVersion
